---
order: 3
title: 实体
type: 核心
label: Core
---

## 实体的管理

### 新增实体

你可以点击层级树面板中的「+」按钮新增实体。需要注意的是，若您此时正选中了某个实体，那么添加的实体将会成为**选中实体的子实体**，否则将默认为场景的子实体：

<Image
  src="https://gw.alipayobjects.com/zos/OasisHub/3d808a9c-429c-4c45-91c4-5d7cb12a2fee/image-20250515120040706.png"  style={{zoom:"50%"}}  />

也可以右键点击某个实体，为它添加子实体：

<Image
  src="https://gw.alipayobjects.com/zos/OasisHub/f4bfef7e-cff3-4fe7-a4d5-2dc253501206/image-20250515120159840.png"  style={{zoom:"50%"}}  />

你既可以添加空实体，也可以快速添加挂载相应功能组件的实体，如挂载相机组件的实体，挂载光源组件实体，以及挂载 3D/2D 基础渲染组件的实体。

添加完毕后，你可以在 **[检查器面板](/docs/interface/inspector)** 中对新实体的属性进行编辑。

### 删除实体

想要删除实体，可以通过以下几种方式：

1. 选中待删实体 -> 点击删除按钮，快捷键是 <Kbd>Delete</Kbd> 

2. 右键某个实体 -> Delete

<Image
  src="https://gw.alipayobjects.com/zos/OasisHub/1e46a6d6-3591-4e16-88b6-e1adbaa38712/image-20250515113606200.png"  style={{zoom:"50%"}}  />

<Callout type="warning">
  删除实体会删除实体及其所有的子实体。所以在删除实体时，你需要注意所删除的实体是否会影响场景中其他实体。
</Callout>

### 拷贝实体

拷贝实体会拷贝选中实体及其所有的子实体，实体所带的组件都会被拷贝。

1. 选中某实体后，通过 `Duplicated` 在同层级下快速克隆该实体，通过快捷键 <Kbd>⌘ + D</Kbd> 快速复制选中的实体。

2. 也可以分别选择 `copy` 与 `paste` ，从而实现跨层级拷贝。

<Image
  src="https://gw.alipayobjects.com/zos/OasisHub/7be3ac6a-2b4e-44c5-b8cc-fbeba7794830/image-20250515113457918.png"  style={{zoom:"50%"}}  />

### 实体排序

为了更好的组织实体，你可以通过拖拽的方式来排序实体。选中一个实体后，可以通过鼠标左键拖拽来改变实体在层级树中的位置。

### 搜索

层级面板上方有一个搜索框，用户可以输入实体的名称来搜索场景中的实体。搜索框支持模糊搜索，你可以输入实体名称的部分字符来查找实体。

### 隐藏实体

每个实体右侧都有一个眼睛按钮，点击可以切换实体在场景中的显示/隐藏状态。

<Callout type="info">
需要注意的是, 此处对实体显示状态的调整仅是工作区的修改, 而非在 **[检查器面板](/docs/interface/inspector)** 中的 `isActive` 的属性。
</Callout>

### 快捷键

以下操作在选中实体后方可生效。

| 操作             | 快捷键                                    |
| :--------------- | :---------------------------------------- |
| `删除实体`       | <Kbd>Backspace</Kbd> 或 <Kbd>Delete</Kbd> |
| `复制实体`       | <Kbd>⌘ + D</Kbd>                          |
| `选中上一个实体` | <Kbd>↑</Kbd>                              |
| `选中下一个实体` | <Kbd>↓</Kbd>                              |
| `展开实体`       | <Kbd>→</Kbd>                              |
| `折叠实体`       | <Kbd>←</Kbd>                              |

## 实体的编辑

点击实体，你就可以对它进行编辑，在右侧的 **[检查器面板](/docs/interface/inspector)** 中你可以编辑它的以下内容：

### 基本信息

<Image
  src="https://gw.alipayobjects.com/zos/OasisHub/12d4148a-f670-443b-8eb2-12c9a837eaea/image-20250515114745494.png"  style={{zoom:"50%"}}  />

| 编号 | 名称     | 说明                                                         |
| ---- | -------- | ------------------------------------------------------------ |
| 1    | 名字     | 实体的名称，脚本可以通过 `scene.findEntityByName("entityName")` 获取实体 |
| 2    | 是否激活 | 实体在场景中是否被激活                                       |
| 3    | 所属层   | 分层管理实体，它可以用于  [裁剪遮罩](/docs/graphics/camera/component/#裁剪遮罩)（用于控制哪些层在渲染过程中被剔除）、 [射线检测](docs/physics/query/raycast)（用于控制哪些层的实体可以被射线检测到）等场景。支持多选。 |

### 组件管理

实体的组件通过平铺的方式展示在检查器面板中，比如最常见的 **Transform** 组件，详细使用请查看[组件](/docs/core/component)文档。

<Image
  src="https://gw.alipayobjects.com/zos/OasisHub/2a670e89-a8de-44b9-b978-5a25e9689fd0/image-20250515153549864.png"
    style={{zoom:"50%"}}
/>

## 脚本使用

### 创建新实体

在[场景](/docs/core/scene)中已经介绍了如何获取激活场景。在新场景中，我们通常会先添加根实体：

```typescript
const scene = engine.sceneManager.activeScene;
const rootEntity = scene.createRootEntity();
```

一般以添加子实体的方式创建新实体：

```typescript
const newEntity = rootEntity.createChild("firstEntity");
```

当然，也可以直接创建实体。但这种实体是游离的，在关联层级树上的实体之前不显示在场景中。

```typescript
const newEntity = new Entity(engine, "firstEntity");
rootEntity.addChild(newEntity);
```

### 删除实体

某个实体在场景中不再需要时，我们可以删除它:

```typescript
rootEntity.removeChild(newEntity);
```

值得注意的是，这种方式仅仅是将物体从层级树上释放出来，不在场景中显示。如果彻底销毁还需要：

```typescript
newEntity.destroy();
```
### 场景中查找实体

#### 根据名字查找实体

  ```typescript
  const entity = scene.findEntityByName("entityName");
  ```
#### 根据路径查找实体

  ```typescript
  const entity = scene.findEntityByPath("parent/child/grandson");
  ```


### 查找子实体

在已知父实体的情况下，通常我们通过父实体来获得子实体：

```typescript
const childrenEntity = newEntity.children;
```

如果明确知道子实体在父实体中的 _index_ 可以直接使用 [getChild](/apis/core/#Entity-getChild)：

```typescript
newEntity.getChild(0);
```

如果不清楚子实体的 index，可以使用 [findByName](/apis/core/#Entity-findByName) 通过名字查找。`findByName` 不仅会查找子实体，还会查找孙子实体。

```typescript
newEntity.findByName("model");
```

如果有同名的实体可以使用 [findByPath](/apis/core/#Entity-findByPath) 传入路径进行逐级查找，使用此 API 也会一定程度上提高查找效率。

```typescript
newEntity.findByPath("parent/child/grandson");
```

### 状态

暂时不使用某实体时，可以通过调用实体的 [isActive](/apis/core/#Entity-isActive) 停止激活，同时该实体下的所有组件都会被**禁用**。

```typescript
newEntity.isActive = false;
```
